package com.sisgesbyte.dao.logistica;

import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.utilDao.CreaFiltroSqlString;
import com.sisgesbyte.data.entity.logistica.AlmacenEntity;
import com.sisgesbyte.data.util.AbstractFacade;

@Stateless
public class MantenimientoAlmacenDaoImpl extends AbstractFacade<AlmacenEntity> implements MantenimientoAlmacenDao {

	@Inject
	private CreaFiltroSqlString creaFiltroSqlString;

	@PersistenceContext(unitName = "SigesSiscompPU")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}

	public MantenimientoAlmacenDaoImpl() {
		super(AlmacenEntity.class);
	}
	
	@Override
	public List<AlmacenEntity> listaAlmacenes(FiltrosSQLBean cadenaFiltros) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT a.id, a.cod_almacen, a.empresa_id, a.locales_id,l.cod_local, a.descripcion, a.pais_id,p.nombre pais , ");
		jpql.append("a.division_pais_id,dp.nombre division,a.ciudad_id ,c.nombre ciudad, a.distrito_id,d.nombre distrito, a.direccion, a.telefono, a.observaciones, a.active  ");
		jpql.append("FROM logistica.almacen a left join sistema.locales l on a.locales_id=l.id ");
		jpql.append("left join localizacion.pais p on a.pais_id=p.id ");
		jpql.append("left join localizacion.division_pais dp on a.division_pais_id=dp.id ");
		jpql.append("left join localizacion.ciudad c on a.ciudad_id=c.id ");
		jpql.append("left join localizacion.distrito d on a.distrito_id=d.id ");
		
		// concatenamos el filtro
		if (cadenaFiltros != null) {
			StringBuilder filtro = new StringBuilder();
			filtro.append(creaFiltroSqlString.concatenar(cadenaFiltros));
			jpql.append(filtro.toString());
		}

		Query query = em.createNativeQuery(jpql.toString(), AlmacenEntity.class);
		
		if (cadenaFiltros != null && cadenaFiltros.getListaValores() != null
				&& cadenaFiltros.getListaValores().size() > 0) {
			int num = 0;
			for (Object valor : cadenaFiltros.getListaValores()) {
				query.setParameter(++num, valor);
			}
		}

		List<AlmacenEntity> ls = query.getResultList();

		return ls;
	}

}
